import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Message } from 'element-ui' //element-ui里面有个Message对象提示message信息
import { getTimeStamp } from '@/utils/auth'
const TimeOut = 3600  //定义超时时间


const service = axios.create({
    //当执行npm run dev  =>  .evn.development  =>  /api =>触发vue.config.js中跨域代理
    baseURL: process.env.VUE_APP_BASE_API,  // /dev-api  /prod-api
    // timeout: 10000  //设置超时时间  一但5秒内没有响应就会报错
})

service.interceptors.request.use(config => {
    //config是请求
    if (store.getters.token) {
        // 只要有token 就要检查token时效性
        //只有在有token的情况下，才有必要去检查时间戳是否超时
        if (IsCheckTimeOut()) {
            //表示token时间过期了  token没用了  因为超时了
            store.dispatch('user/logout')  //登出功能
            router.push("/login")  //调回登录页
            return Promise.reject(new Error('token超时了'))
        }
        //注入token
        config.headers.Authorization = `Bearer ${store.getters.token}`
    }
    // return config
    return config  //config是必须要返回的
}, error => {
    return Promise.reject(error)
})
//响应拦截器
service.interceptors.response.use(response => {
    //axios默认加了一层data   response.data
    const { success, message, data } = response.data
    //要根据success的成功与否决定下面的操作
    if (success) {
        return data  //返回的Token
    } else {
        //业务已经错误，响应回了错误信息,不能进then，应该进catch
        Message.error(message)   //提示错误信息
        return Promise.reject(new Error(message)) //因为此时没有error错误信息的对象，所以必须new一个error出来
    }
}, error => {
    //error 信息里面会有response对象
    if (error.response && error.response.data && error.response.data.code === 10002) {
        //当等于10002的时候  表示后端告诉我token超时了
        store.dispatch('user/logout')//登出
        router.push('/login')  //跳转到login页面

    } else {
        Message.error(error.message)  //提示错误信息
    }
    return Promise.reject(error)  //返回执行错误  让当前的执行链跳出成功  直接进入catch


})


function IsCheckTimeOut() {
    const currentTime = Date.now()  //当前时间戳
    const timeStamp = getTimeStamp()
    return (currentTime - timeStamp) / 1000 > TimeOut   //TimeOut上面定义的超时时间
}

export default service